package com.gzz.orchid.context.application.rbac.impl;

import com.gzz.orchid.common.core.model.ActionCmd;
import com.gzz.orchid.common.core.util.I18nUtil;
import com.gzz.orchid.context.application.rbac.IModuleExecutor;
import com.gzz.orchid.context.application.rbac.command.ModuleSaveCmd;
import com.gzz.orchid.context.application.rbac.convert.ModuleConverter;
import com.gzz.orchid.context.domain.rbac.IModuleRepository;
import com.gzz.orchid.context.domain.rbac.IModuleService;
import com.gzz.orchid.context.domain.rbac.entity.ModuleDo;
import com.gzz.orchid.context.infrastructure.definition.Status;
import com.gzz.orchid.context.infrastructure.persistence.entity.sys.SysModulePo;
import com.gzz.orchid.context.infrastructure.persistence.mapper.sys.SysModuleMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * @author higmd
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class ModuleExecutor implements IModuleExecutor {
    private final SysModuleMapper mapper;
    private final IModuleService service;
    private final IModuleRepository repository;

    @Override
    public void save(ModuleSaveCmd saveCmd) {
        SysModulePo modulePo;
        if (Objects.isNull(saveCmd.getId())) {
            modulePo = new SysModulePo();
            modulePo.setStatus(0);
        } else {
            modulePo = null;
            //mapper.selectOneById(saveCmd.getId());
        }
        // 检查code的唯一性
        ModuleDo moduleDo = new ModuleDo();
        moduleDo.setCode(saveCmd.getCode());
        moduleDo.setId(modulePo.getId());
        service.checkCodeUnique(moduleDo);
        // 设置属性
        ModuleConverter
                .INSTANCE
                .updatePo(modulePo, saveCmd);
        //  持久化
        //mapper.insertOrUpdateSelective(modulePo);
    }

    @Override
    public void delete(ActionCmd cmd) {
        List<ModuleDo> modules = repository.findListByIds(cmd.getIds());
        // 验证 不符合抛出异常
        modules.forEach(mDo -> {
            if (mDo.getParentId() != null) {
                throw new IllegalArgumentException(I18nUtil.ofMessage("模块[%s]有子模块，不能删除", mDo.getName()));
            }
        });
        //
        //mapper.deleteBatchByIds(Arrays.asList(cmd.getIds()));
    }

    @Override
    public void disable(ActionCmd cmd) {
        List<ModuleDo> modules = repository.findListByIds(cmd.getIds());
        // 验证 不符合抛出异常
        modules.forEach(mDo -> {
            if (!mDo.getStatus().equals(Status.ENABLED)) {
                throw new IllegalArgumentException(I18nUtil.ofMessage("模块[%s]当前的状态为[ %s]，不能禁用"
                        , mDo.getName()
                        , I18nUtil.message(mDo.getStatus().getLabel())));
            }
        });
        // 执行
        repository.batchChangeStatus(Status.DISABLED, modules);
    }

    @Override
    public void enable(ActionCmd cmd) {
        List<ModuleDo> modules = repository.findListByIds(cmd.getIds());
        // 验证 不符合抛出异常
        modules.forEach(mDo -> {
            if (!mDo.getStatus().equals(Status.DISABLED)) {
                throw new IllegalArgumentException(I18nUtil.ofMessage("模块[%s]当前的状态为[ %s]，不能启用"
                        , mDo.getName()
                        , I18nUtil.message(mDo.getStatus().getLabel())));
            }
        });
        // 执行
        repository.batchChangeStatus(Status.ENABLED, modules);
    }

    @Override
    public void audit(ActionCmd cmd) {
        List<ModuleDo> modules = repository.findListByIds(cmd.getIds());
        // 验证 不符合抛出异常
        modules.forEach(mDo -> {
            if (!mDo.getStatus().equals(Status.CREATED)) {
                throw new IllegalArgumentException(I18nUtil.ofMessage("模块[%s]当前的状态为[ %s]，不能审核"
                        , mDo.getName()
                        , I18nUtil.message(mDo.getStatus().getLabel())));
            }
        });
        // 执行
        repository.batchChangeStatus(Status.ENABLED, modules);
    }
}
